package com.zjj.learn.designmodel.work.adapter;

public class AdapterTest {


    public static void main(String[] args) {

        //声明一个适配者
        ChinaComputer chinaComputer = new ChinaComputer();
        //声明一个国产电脑适配器，将国产电脑交给适配器
        ChinaComputerAdapter adapter = new ChinaComputerAdapter(chinaComputer);
        //给适配器充电
        adapter.power();

    }


    /**
     * 适配器模式的使用：结构型模式
     *    适配器模式的特征：
     *       适配器类需要实现目标接口，适配者需要聚合到适配器类，在适配器类执行目标接口中的方法时，在执行支配者中的具体方法时做一些其他操作。
     *
     *    在生活中，假设我们拿着自己的电脑去了别的国家旅游，咱们国家电压标准都是 220V 的交流电，插头一般为三角扁平插头。
     *    但是其他国家的电压标准和咱们国家不一样，并且插头的格式也不一样，这样咱们的充电设备就不能在其他国家直接使用。
     *    这时就需要一个类似中间件的东西可以将适配自己的插头并且将电压情况转化成自己可以使用的，这就是适配器模式的应用。
     *
     * 适配器模式分为类适配器和对象适配器
     * 适配器模式下一班有三种角色：这里使用对象【使用组合的方法实现】适配器方式
     *    1、目标接口（target）：当前业务锁期待的接口，在这里目标接口就是 插头
     *       见：{@link com.zjj.learn.designmodel.work.adapter.PlugInterface}
     *    2、适配器类（Adapter）：转换器
     *       见：{@link com.zjj.learn.designmodel.work.adapter.ChinaComputerAdapter}
     *    3、适配者类（Adaptee）：
     *       见：{@link com.zjj.learn.designmodel.work.adapter.ChinaComputer}
     **/


    /**
     *                        123456789ab_cdef  ---- 索引
     *                       __________________
     *                11011 / 11001010101_0000
     *                        11011
     *                        ------------------
     *                           10010           ---010 对应索引 678
     *                           11011
     *                       -------------------------
     *                            10011         ----末位 1 对应第 9 位
     *                            11011
     *                      ------------------------
     *                             10000       ----- 末位 0 对应 索引 a
     *                             11011
     *                      -----------------------
     *                              10111     ------ 末位 1 对应索引 b
     *                              11011
     *                      ------------------------
     *                               1100_0   ----- 末位 0 对应索引 c
     *                               1101_1
     *                      ------------------------
     *                                  1_1000     ---- 末位 000 对应索引 def
     *                                  1_1011
     *                     --------------------------
     *                                    0011    -------- 校验位取最后 4 位余数 0011
     **/
}
